package process

import (
	"fmt"
	"os"
	"net"
	"go_code/projectExec2/client/utils"
	"go_code/projectExec2/common/message"
	"encoding/json"
	"bufio"
)
var smsProcess = &SmsProcess{}
var scanner = bufio.NewScanner(os.Stdin)
//显示登录成功后的界面
func ShowMenu(){
	fmt.Println("------------------------")
	fmt.Println("-------1、在线用户------")
	fmt.Println("-------2、发送消息------")
	fmt.Println("-------3、信息列表------")
	fmt.Println("-------4、退出系统------")
	fmt.Printf("请选择（1-4）：")
	var key int 
	var content string

	fmt.Scanln(&key)
	switch key {
		case 1:
			fmt.Println("显示在线用户列表~")
			outputOnlineUser()
		case 2:
			fmt.Printf("\n开始发送消息~\n请输入你想对大家说的话：")
			
			scanner.Scan()  //这两行用于从终端获取输入的内容，并且防止空格输入
			content = scanner.Text()	//然后疯狂跳至下一输入点
			if err := scanner.Err();err != nil{
				fmt.Println("os.Stdin reading err :",err)
			}
			smsProcess.SendGroupMes(content)
		case 3:
			fmt.Println("信息列表~")
		case 4:
			fmt.Println("你选择了退出系统...")
			os.Exit(0)
		default:
			fmt.Println("请选择有效选项...")		
	}
}

//该函数用于与服务器端保持通讯的
func ServerProcessMes(conn net.Conn){
	//创建一个tranfer实例，来不断读取服务器端发送来的消息
	tf := &utils.Transfer{
		Conn : conn,
	}
	for {
		fmt.Println("客户端正在等待读取服务器端发送消息...")
		mes , err := tf.ReadPkg()
		if err != nil{
			fmt.Println("服务器出错了~")
			break
		}
		//如果读取到数据，执行下部操作
		//fmt.Println("read ::: ",mes)
		switch mes.Type {
			case message.NotifyUserStatusMesType : //有人上线了

				//1、取出NotifyUserStatusMes
				var notifyUserStatusMes message.NotifyUserStatusMes
				err = json.Unmarshal([]byte(mes.Data),&notifyUserStatusMes)
				if err != nil {
					fmt.Println("获取新上线用户状态时反序列化异常！Error: ",err)
					return
				}
				//2、把这个用户信息状态保存到客户端的map[int]*User中
				updateUserStatus(&notifyUserStatusMes)
				outputOnlineUser()


			case message.SmsMesType :
				var smsMes message.SmsMes
				err = json.Unmarshal([]byte(mes.Data),&smsMes)
				if err != nil {
					fmt.Println("获取群发消息时反序列化异常！Error: ",err)
					return
				}
				outputGroupMes(&smsMes)



			default :
				fmt.Println("服务器端返回了一个未知消息类型，暂未能处理...")
		}
	}
}